﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using SIMCRepositorio;
using SIMCObjetoNegocio;
using SIMCReglasNegocio;
using Helper;

namespace SIMCFachadaNegocio
{
    public class FachadaPersona : FachadaBase
    {        
        private IRepositorioAtributoPersona m_AtributoPersonaRepository = DatabaseAccess.AtributoPersonaRepositorio;
        private IRepositorioPersona m_PersonaRepository = DatabaseAccess.PersonaRepositorio;
        private IRepositorioDireccion m_DireccionRepository = DatabaseAccess.DireccionRepositorio;
        private IRepositorioCuenta m_CuentaRepository = DatabaseAccess.CuentaRepositorio;
        private IRepositorioDocumento m_DocumentoRepository = DatabaseAccess.DocumentoRepositorio;
        
        public IList<DocumentoPersona> BuscarListaDocumento(int p_IdPersona)
        {
            try
            {
                return m_DocumentoRepository.BuscarLista(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Persona BuscarPersona(int p_IdPersona)
        {
            try
            {
                return m_PersonaRepository.Buscar(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public PersonaPlana BuscarPersonaPlana(int p_IdPersona)
        {
            try
            {
                return m_PersonaRepository.BuscarDTO(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<DireccionFisica> BuscarListaDireccion(int p_IdPersona)
        {
            try
            {
                return m_DireccionRepository.BuscarLista(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public DireccionFisica BuscarDireccion(int p_IdPersona, string p_TipoDireccion)
        {
            try
            {
                return m_DireccionRepository.BuscarDireccion(p_IdPersona, p_TipoDireccion);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<ClasificacionPersonas> BuscarListaAtributo(int p_IdPersona)
        {
            try
            {
                return m_AtributoPersonaRepository.Buscar(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public List<ClasificacionPersonas> BuscarListaAtributo(int p_IdPersona, string p_Atributo)
        {
            try
            {
                return m_AtributoPersonaRepository.Buscar(p_IdPersona, p_Atributo);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<CuentaBancaria> BuscarListaCuentaBancaria(int p_IdPersona)
        {
            try
            {
                return m_CuentaRepository.BuscarLista(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
        
        public CuentaBancaria BuscarCuentaBancaria(int p_IdPersona, int p_IdCuenta)
        {
            try
            {
                return m_CuentaRepository.BuscarCuentaPorId(p_IdPersona, p_IdCuenta);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public IList<Relacion> BuscarListaRelacion(int p_IdPersona)
        {
            try
            {
                return m_PersonaRepository.BuscarListaRelaciones(p_IdPersona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public Relacion BuscarRelacion(int p_IdPersona1, int p_IdPersona2)
        {
            try
            {
                return m_PersonaRepository.BuscarRelacion(p_IdPersona1, p_IdPersona2);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void GuardarPersona(Persona t_Persona)
        {
            try
            {
                m_PersonaRepository.Guardar(t_Persona);
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }

        public void GuardarRelacion(Relacion p_Relacion)
        {
            try
            {
                AgregarRegla(new ExisteRelacion(m_PersonaRepository, p_Relacion));

                if (EsValido)
                {
                    m_PersonaRepository.GuardarRelacion(p_Relacion);
                }
                else
                {
                    throw new ArgumentException(MostrarReglasRotas());
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }
        }
    }
}
